package cn.edu.wtbu.wtbu_music_server.controller;

import cn.edu.wtbu.wtbu_music_server.dto.R;
import cn.edu.wtbu.wtbu_music_server.entity.User;
import cn.edu.wtbu.wtbu_music_server.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 计算机网络
 * TCP/IP(传输控制协议) ---> Http协议？
 * UDP(用户数据报协议)
 *
 * 用户相关功能接口
 * 1. 登录
 * 2. 注册
 * 3. 修改用户信息
 * 4. 根据id获取用户信息
 * 5. 删除用户
 * 6. 分页获取用户列表
 */
@Tag(name = "用户接口",description = "用户模块相关的Rest接口")
@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 处理用户登录请求。
     *
     * @param username 用户名或手机号。
     * @param password 用户密码。
     * @return 返回登录结果，包括成功与否、错误消息和可能的数据（如登录成功时的用户信息）。
     */
    @Operation(summary = "用户登录",description = "根据提供的用户名和密码实现用户登录功能")
    @Parameters({
            @Parameter(name = "username",description = "用户名或手机号",required = true),
            @Parameter(name = "password",description = "用户密码",required = true)
    })
    @GetMapping("/login")
    public R login(@RequestParam("username") String username,@RequestParam("password") String password){
        // 构建查询条件，查询用户名或手机号匹配的用户
        QueryWrapper<User> query = Wrappers.query(User.class);
        query.eq("username",username)
            .or()
            .eq("phone",username);
        User user = userService.getOne(query);

        // 用户不存在时的处理
        if(user == null){
            return R.fail().setMsg("账号不正确");
        }

        // 用户存在但状态被禁用时的处理
        if(user.getStatus() != 0){
            return R.fail().setMsg("账号禁用").setCode(1);
        }

        // 验证密码是否正确
        if(user.getPassword().equals(password)){
            return R.ok().setMsg("登录成功").setData(user);
        }

        // 密码错误的处理
        return R.fail().setMsg("密码错误").setCode(2);
    }

    /**
     * 实现用户注册功能，提供用户对象User，返回注册结果。
     */
    @Operation(summary = "用户注册",description = "根据提供的用户对象实现用户注册功能")
    @PostMapping("/reg")
    public R register(@RequestBody User user){
        // 验证用户名是否已存在
        QueryWrapper<User> query = Wrappers.query(User.class);
        query.eq("username",user.getUsername());
        User existUser = userService.getOne(query);
        if(existUser != null){
            return R.fail().setMsg("用户名已存在");
        }

        // 验证手机号是否已存在
        query = Wrappers.query(User.class);
        query.eq("phone",user.getPhone());
        existUser = userService.getOne(query);
        if(existUser != null){
            return R.fail().setMsg("手机号已存在");
        }
        return userService.save(user) ? R.ok().setMsg("注册成功") : R.fail().setMsg("注册失败");
    }

    /**
     * 根据用户id修改用户信息
     */
    @Operation(summary = "修改用户信息",description = "根据提供的用户对象修改用户信息,务必包含用户id")
    @PutMapping("/update")
    public R update(@RequestBody User user){
        return userService.updateById(user) ? R.ok().setMsg("修改成功") : R.fail().setMsg("修改失败");
    }

    /**
     * 根据用户id查询用户信息
     */
    @Operation(summary = "查询用户信息",description = "根据提供的用户id查询用户信息")
    @Parameter(name = "id",description = "用户id",required = true)
    @GetMapping("/info/{id}")
    public R info(@PathVariable Integer id){
        User user = userService.getById(id);
        return user != null ? R.ok().setData(user) : R.fail().setMsg("用户不存在");
    }

    /**
     * 根据id删除用户对象
     */
    @Operation(summary = "删除用户",description = "根据提供的用户id删除用户信息")
    @Parameter(name = "id",description = "用户id",required = true)
    @DeleteMapping("/delete/{id}")
    public R delete(@PathVariable Integer id){
        return userService.removeById(id) ? R.ok().setMsg("删除成功") : R.fail().setMsg("删除失败");
    }

    /**
     * 分页查询用户信息，根据提供当前页码和每页数据条数
     */
    @Operation(summary = "分页查询用户信息",description = "根据提供的当前页码和每页数据条数分页查询用户信息")
    @Parameters({
            @Parameter(name = "page",description = "当前页码",required = true),
            @Parameter(name = "size",description = "每页数据条数",required = true)
    })
    @GetMapping("/list")
    public R list(Integer page, Integer size){
        //执行分页查询  select * from user limit 20,10
        List<User> list = userService.list(new Page<>(page, size));
        return R.ok().setData(list);
    }

}
